package com.cskaoyan.javase.oop2.polymorphic10.basic2.field1;

/**
 * @description: 多态中的成员变量的访问
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 成员变量和多态有没有关系？
 * 成员变量和多态没有任何关系
 * 如果时多态的父类引用指向了子类对象的方式
 * 会存在
 * 编译时看左边，运行时看左边
 * 我们都是通过引用去访问堆上的对象的，对象中有什么成员，引用是没有关系的
 * 我们只能通过引用才能调用堆上对象的成员
 * 父类的引用里面只有父类自身的成员信息
 * 所以通过父类的引用只能调用父类的成员，这叫编译看左边
 * 对于成员变量而言，不存在多态性，于是引用是什么，调用的就是什么
 * 引用是父类的引用，那么访问结果就是父类中的结果，这叫运行看左边
 *
 * > 解释成员变量不具有多态性，一个例子
 * - 成员变量描述的是对象的“外貌特征”
 * - 把子类对象赋值给父类类型的引用，就相当于给子类对象披上了一个父类类型马甲
 * - 外貌特征上来看，这时候的子类就变成了父类
 * - 编译时看左边，运行时看左边
 *
 */
public class Demo {
    public static void main(String[] args) {
        //父类引用指向子类对象
        Father f = new Son();
        //这个f可以直接调用哪些成员？
        //这里通过父类的引用只能调用父类成员
        System.out.println(f.a);
        System.out.println(f.fatherVar);
        //((Son) f).sonVar
        //System.out.println(f.sonVar);
    }
}
class Father{
    int a = 10;
    int fatherVar = 20;
}
class Son extends Father{
    int a = 100;
    int sonVar = 200;
}
